package com.acgist.snail.utils;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.nio.ByteBuffer;
import java.util.Map;

import org.junit.jupiter.api.Test;

class PeerUtilsTest extends Performance {

    @Test
    void testReadIPv4() {
        final ByteBuffer buffer = ByteBuffer.allocate(12);
        buffer.putInt(NetUtils.ipToInt("192.168.1.1"));
        buffer.putShort(NetUtils.portToShort(18888));
        buffer.putInt(NetUtils.ipToInt("192.168.1.100"));
        buffer.putShort(NetUtils.portToShort(28888));
        buffer.flip();
        final Map<String, Integer> map = PeerUtils.readIPv4(buffer);
        this.log(map);
        assertEquals(2, map.size());
    }
    
    @Test
    void testReadIPv6() {
        final ByteBuffer buffer = ByteBuffer.allocate(36);
        buffer.put(NetUtils.ipToBytes("fe80::f84b:bc3a:9556:683d"));
        buffer.putShort(NetUtils.portToShort(18888));
        buffer.put(NetUtils.ipToBytes("fe80::f84b:bc3a:9556:683f"));
        buffer.putShort(NetUtils.portToShort(28888));
        buffer.flip();
        final Map<String, Integer> map = PeerUtils.readIPv6(buffer);
        this.log(map);
        assertEquals(2, map.size());
    }
    
    @Test
    void testAllowedFast() {
        final String ip = "80.4.4.200";
        final byte[] infoHash = StringUtils.unhex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        final int[] trueValues = {1059, 431, 808, 1217, 287, 376, 1188, 353, 508, 1246};
        int[] values = PeerUtils.allowedFast(1, ip, infoHash);
        assertEquals(1, values.length);
        values = PeerUtils.allowedFast(1313, ip, infoHash);
        assertArrayEquals(trueValues, values);
        this.log("Piece索引：{}", values);
    }
    
    @Test
    void testUrlEncode() {
        final byte[] source = {0x01, (byte) 0xFF, 0x12, 0x34, 0x56, 0x78, (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF1, 0x23, 0x45, 0x67, (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF, 0x12, 0x34, 0x56, 0x78, (byte) 0x9A};
        final String target = "%01%FF%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF%124Vx%9A";
        this.log(PeerUtils.urlEncode(source));
        assertTrue(StringUtils.equalsIgnoreCase(target, PeerUtils.urlEncode(source)));
        final byte[] bytes = ArrayUtils.random(20);
        this.log(new String(bytes));
        final String value = PeerUtils.urlEncode(bytes);
        this.log(value);
        this.costed(100000, () -> PeerUtils.urlEncode(bytes));
    }
    
}
